package com.bkhech.home.practice.javacore.nio.pipe;

import java.nio.ByteBuffer;
import java.nio.channels.Pipe;

/**
 * PipeDemo
 *
 * 实际应用中，你可能会在两个不同的线程中使用 Pipe，
 * 一个线程负责写入数据到 SinkChannel，另一个线程负责从 SourceChannel 读取数据。
 *
 * 使用 java.nio.Pipe 可以方便地在多线程之间传输数据，
 * 而不需要使用传统的线程间通信方式（如 wait()、notify() 等）
 *
 * 如果只需要在线程间简单地传输数据，可以使用 PipedInputStream 和 PipedOutputStream，
 * 通常情况下，Pipe 提供了更高的性能和效率，特别是在多线程并发读写的场景中
 *
 * @author guowm
 * @date 2024/3/31
 */
public class PipeDemo {
    public static void main(String[] args) throws Exception {
        // 创建管道
        Pipe pipe = Pipe.open();

        // 获取管道的输出通道
        Pipe.SinkChannel sinkChannel = pipe.sink();

        // 获取管道的输入通道
        Pipe.SourceChannel sourceChannel = pipe.source();

        // 向管道写入数据
        String data = "Hello, Pipe!";
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        buffer.clear();
        buffer.put(data.getBytes());
        buffer.flip();
        while (buffer.hasRemaining()) {
            sinkChannel.write(buffer);
        }

        // 从管道读取数据
        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
        int bytesRead = sourceChannel.read(readBuffer);
        readBuffer.flip();
        byte[] bytes = new byte[bytesRead];
        readBuffer.get(bytes);
        String receivedData = new String(bytes);
        System.out.println("Received: " + receivedData);

        // 关闭通道和管道
        sinkChannel.close();
        sourceChannel.close();
    }
}
